from django.db import models
from django.contrib.auth.models import User
from public.models import CommonInfo
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
from django.conf import settings


# Create your models here.
# 每当保存一个用户时就生成一个token。之后的RESTful API开发时用到的
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)


class App(CommonInfo):
    """
    应用
    """
    jenkins_job = models.CharField(max_length=255, verbose_name="JENKINS JOB 名称")
    git_url = models.CharField(max_length=512, verbose_name="Git 地址")
    # 编译命令是在哪个目录下执行的，比如：java中的maven项目，就是指pox.xml文件所在目录
    dir_build_file = models.CharField(max_length=512, verbose_name="编译目录")
    # 对于Java项目，就是mvn开头的命令；对于Python、JS这些动态语言，就是zip、tar这种打包命令
    build_cmd = models.CharField(max_length=512, default="./", verbose_name="编译命令")
    # 设置这个APP在软件发布后，是否需要进行重启（比如，war包、jar包等发布时候，是需要重启，才能生效的）
    is_restart_status = models.BooleanField(default=True, verbose_name="是否重启")
    package_name = models.CharField(max_length=128, blank=True, null=True, verbose_name="软件包名")
    # 一般是把配置文件和可执行文件一起打包，这个包的名称
    zip_package_name = models.CharField(max_length=128, blank=True, null=True, verbose_name="压缩包名")
    # 记录下这个应用的服务器启停日志，记录操作次数
    op_log_no = models.IntegerField(blank=True, null=True, default=0)
    # 记录公司内哪个用户可管理这个APP，这个管理权限包括定义那些用户可以建立发布单、那些用户可以流转环境，以及不同环境下，那些用户有发布和启动服务的权限
    manage_user = models.ForeignKey(User, blank=True, null=True, related_name="manage_user", on_delete=models.CASCADE,
                                    verbose_name="App 管理员")
    # 定义每个应用的软件包拉取、启停服务、备份软件包、回滚操作。这个脚本是放在Nginx服务器的目录下，每次发布软件时，调用SaltStack的script_run命令，通过HTTP协议远程调用此脚本执行
    script_url = models.CharField(max_length=128, blank=True, null=True, verbose_name="App 脚本链接")

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'app'
        ordering = ('-add_date',)
